package cdautils;

import java.io.IOException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.regex.Pattern;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPathExpressionException;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;




/**
 * Utility-Class for Creating TriageTag-entities from XML and vice versa.
 */
public class CDAParser {
	
	/**
	 * Diese Methode liest ein CDA-Dokument aus und liefert ein TriageTag-Objekt.
	 * @param doc CDA-Dokument, das geparsed werden soll.
	 * @return		TriageTag-Objekt, das die Daten aus dem CDA-Dokument enthï¿½lt.
	 * @throws NumberFormatException
	 */
	public static TriageTag XmlToTriageTagObject(Document doc) throws NumberFormatException {
		
		// document_uid auslesen
		String document_uid = doc.getElementsByTagName("id").item(0).
				getAttributes().item(0).getNodeValue();
				
		// document_vnr auslesen
		Integer document_vnr = Integer.parseInt(doc.getElementsByTagName("versionNumber").item(0).
				getAttributes().item(0).getNodeValue());
		
		// document_parent_uid auslesen		
		String document_parent_uid = doc.getElementsByTagName("id").item(4).
				getAttributes().item(0).getNodeValue();

		// document_parent_vnr
		Integer document_parent_vnr = Integer.parseInt(doc.getElementsByTagName("versionNumber").item(1).
				getAttributes().item(0).getNodeValue());
				
		// effectiveTime auslesen		
		String effectiveTimeStamp = doc.getElementsByTagName("effectiveTime").item(0).
				getAttributes().item(0).getNodeValue();
		GregorianCalendar effectiveTime = new GregorianCalendar(Integer.parseInt(effectiveTimeStamp.substring(0, 4)), 
				Integer.parseInt(effectiveTimeStamp.substring(4, 6)) - 1, Integer.parseInt(effectiveTimeStamp.substring(6, 8)));
		
		// given auslesen		
		String given = doc.getElementsByTagName("given").item(0).getTextContent();
				
		// family auslesen		
		String family = doc.getElementsByTagName("family").item(0).getTextContent();
				
		// gender auslesen		
		String genderCode = doc.getElementsByTagName("administrativeGenderCode").item(0).
				getAttributes().item(0).getNodeValue();
		TriageTag.Gender gender = TriageTag.Gender.getFromString(genderCode);
				
		// birthdate auslesen
		String birthdateTimeStamp = doc.getElementsByTagName("birthTime").item(0).
				getAttributes().item(0).getNodeValue();
		GregorianCalendar birthdate = new GregorianCalendar(Integer.parseInt(birthdateTimeStamp.substring(0, 4)), 
				Integer.parseInt(birthdateTimeStamp.substring(4, 6)) - 1, Integer.parseInt(birthdateTimeStamp.substring(6, 8)));	
				
		// author_uid auslesen
		String author_uid = doc.getElementsByTagName("id").item(2).
				getAttributes().item(0).getNodeValue();
		
		// author_given auslesen
		String author_given = doc.getElementsByTagName("given").item(1).getTextContent();
		
		// author_family auslesen
		String author_family = doc.getElementsByTagName("family").item(1).getTextContent();
				
		// Vitalzeichen komplett aus Body auslesen	
		String vitalstring = doc.getElementsByTagName("text").item(0).getTextContent();
				
		// Details komplett aus Body auslesen		
		String detailstring = doc.getElementsByTagName("text").item(1).getTextContent();
				
		// Verletzungen komplett aus Body auslesen		
		String verletzungenstring = doc.getElementsByTagName("text").item(2).getTextContent();
				 
		/**
		 * Da der Body kein valides XML-Schema besitzt, kï¿½nnen die Attribute in den Sektionen
		 * Vitalzeichen, Details und Verletzungen nicht mittels XPath ausgelesen werden.
		 * Der Parse-Vorgang wird mit einem Scanner-Objekt fortgesetzt.
		 */
		
		/**
		 * VITALDATEN		
		 */		
		Boolean gehfaehigkeit = null;
		TriageTag.Stability respiration = null;
		TriageTag.Stability perfusion = null;
		TriageTag.Stability mentalerstatus = null;
		TriageTag.TriageCategory triagekategorie = null;
		TriageTag.TreatmentStatus behandlungsstatus = null;
		
		String[] vitalStringArray = vitalstring
				.split(Pattern.quote("<br />") + "|" + Pattern.quote("<br/>"));
		
		for (String s : vitalStringArray) {
			String[] line = s.split(":");
			if (line[0].trim().equalsIgnoreCase("gehfaehigkeit")) {
				if (line.length > 1) {
					if (line[1].trim().equalsIgnoreCase("ja")) {
						gehfaehigkeit = true;
					} else if (line[1].trim().equalsIgnoreCase("nein")) {
						gehfaehigkeit = false;
					}
				}
			} else if(line[0].trim().equalsIgnoreCase("respiration")) {
				if (line.length > 1) {
					if (line[1].trim().equalsIgnoreCase("stabil")) {
						respiration = TriageTag.Stability.STABLE;
					} else if (line[1].trim().equalsIgnoreCase("kritisch")) {
						respiration = TriageTag.Stability.CRITICAL;
					}
				}
			} else if (line[0].trim().equalsIgnoreCase("perfusion")) {
				if (line.length > 1) {
					if (line[1].trim().equalsIgnoreCase("stabil")) {
						perfusion = TriageTag.Stability.STABLE;
					} else if (line[1].trim().equalsIgnoreCase("kritisch")) {
						perfusion = TriageTag.Stability.CRITICAL;
					}
				}
			} else if (line[0].trim().equalsIgnoreCase("mentalerstatus")) {
				if (line.length > 1) {
					if (line[1].trim().equalsIgnoreCase("stabil")) {
						mentalerstatus = TriageTag.Stability.STABLE;
					} else if (line[1].trim().equalsIgnoreCase("kritisch")) {
						mentalerstatus = TriageTag.Stability.CRITICAL;
					}
				}
			} else if (line[0].trim().equalsIgnoreCase("triagekategorie")) {
				if (line.length > 1) {
					if (line[1].trim().equalsIgnoreCase("minor")) {
						triagekategorie = TriageTag.TriageCategory.MINOR;
					} else if (line[1].trim().equalsIgnoreCase("delayed")) {
						triagekategorie = TriageTag.TriageCategory.DELAYED;
					} else if (line[1].trim().equalsIgnoreCase("immediate")) {
						triagekategorie = TriageTag.TriageCategory.IMMEDIATE;
					} else if (line[1].trim().equalsIgnoreCase("deceased")) {
						triagekategorie = TriageTag.TriageCategory.DECEASED;
					}
				}
			} else if (line[0].trim().equalsIgnoreCase("behandlung")) {
				if (line.length > 1) {
					if (line[1].trim().equalsIgnoreCase("undefiniert")) {
						behandlungsstatus = TriageTag.TreatmentStatus.UNDEFINED;
					} else if (line[1].trim().equalsIgnoreCase("gesichtet")) {
						behandlungsstatus = TriageTag.TreatmentStatus.SIGHTED;
					} else if (line[1].trim().equalsIgnoreCase("geborgen")) {
						behandlungsstatus = TriageTag.TreatmentStatus.RESCUED;
					} else if (line[1].trim().equalsIgnoreCase("abtransportiert")) {
						behandlungsstatus = TriageTag.TreatmentStatus.EVACUATED;
					}
				}
			}
		}
		
		/**
		 * DETAILS
		 */
		Double gps_longitude = null;
		Double gps_latitude = null;
		Double gps_accuracy = null;
		TriageTag.PhaseOfLife lebensphase = null;
		String bergeinformation = null;
		String hilfplatzposition = null;
		Integer urgency = null;
		String diagnosis = null;
		Integer blood_pressure_systolic = null;
		Integer blood_pressure_diastolic = null;
		Integer puls = null;
		String behandlungsverlauf = null;
		Boolean transportbereitschaft = null;
		String zielkrankenhaus = null;
		String krankenkasse = null;
		
		String[] detailStringArray = detailstring
				.split(Pattern.quote("<br />") + "|" + Pattern.quote("<br/>"));
		
		for (String s : detailStringArray) {
			String[] line = s.split(":");
			
			// GPS
			if (line[0].trim().equalsIgnoreCase("gps")) {
				if (line.length > 1) {
					if (!line[1].equalsIgnoreCase("ka")) {
						String[] gpsArray = line[1].split(",");
						if (gpsArray.length == 3) {
							try {
								gps_latitude = Double.parseDouble(gpsArray[0]);
								gps_longitude = Double.parseDouble(gpsArray[1]);
								gps_accuracy = Double.parseDouble(gpsArray[2]);
							} catch (NumberFormatException e) {
								throw new NumberFormatException("GPS-Koordinaten " +
										"beinhalten ungültige Zahlen.");
							}
						}
					}
				}
				
			// LEBENSPHASE
			} else if (line[0].trim().equalsIgnoreCase("lebensphase")) {
				if (line.length > 1) {
					if (line[1].trim().equalsIgnoreCase("kind")) {
						lebensphase = TriageTag.PhaseOfLife.CHILD;
					} else if (line[1].trim().equalsIgnoreCase("erwachsen")) {
						lebensphase = TriageTag.PhaseOfLife.ADULT;
					}
				}
				
			// BERGEINFORMATION
			} else if (line[0].trim().equalsIgnoreCase("bergeinformation")) {
				if (line.length > 1) {					
					bergeinformation = readPlainTextValue(line);
				}
			
			// HILFPLATZPOSITION
			} else if(line[0].trim().equalsIgnoreCase("hilfplatzposition")) {
				if (line.length > 1) {
					hilfplatzposition = readPlainTextValue(line);
				}
				
			// DRINGLICHKEIT
			} else if(line[0].trim().equalsIgnoreCase("dringlichkeit")) {
				if (line.length > 1) {
					if (line[1].trim().equals("1")) {
						urgency = 1;
					} else if (line[1].trim().equals("2")) {
						urgency = 2;
					} else if (line[1].trim().equals("3")) {
						urgency = 3;
					} else if (line[1].trim().equals("4")) {
						urgency = 4;
					} else if (line[1].trim().equals("5")) {
						urgency = 5;
					}
				}
				
			// DIAGNOSE
			} else if (line[0].trim().equalsIgnoreCase("diagnose")) {
				if (line.length > 1) {
					diagnosis = readPlainTextValue(line);
				}
				
			// BLUTDRUCK
			} else if(line[0].trim().equalsIgnoreCase("blutdruck")) {
				if (line.length == 3) {
					try {
						blood_pressure_systolic = Integer.parseInt(line[1].trim());
						blood_pressure_diastolic = Integer.parseInt(line[2].trim());
					} catch(NumberFormatException e) {
						throw new NumberFormatException("Blutdruck ist keine gültige Zahl.");
					}
				}
				
			// PULS
			} else if(line[0].trim().equalsIgnoreCase("puls")) {
				if (line.length > 1) {
					try {
						puls = Integer.parseInt(line[1].trim());
					} catch (NumberFormatException e) {
						throw new NumberFormatException("Puls ist keine gültige Zahl.");
					}
				}
				
			// BEHANDLUNGSVERLAUF
			} else if (line[0].trim().equalsIgnoreCase("behandlungsverlauf")) {
				if (line.length > 1) {
					behandlungsverlauf = readPlainTextValue(line);
				}
				
			// TRANSPORTBEREITSCHAFT
			} else if (line[0].trim().equalsIgnoreCase("transportbereitschaft")) {
				if (line.length > 1) {
					if (line[1].trim().equalsIgnoreCase("ja")) {
						transportbereitschaft = true;
					} else if (line[1].trim().equalsIgnoreCase("nein")) {
						transportbereitschaft = false;
					}
				}
				
			// ZIELKRANKENHAUS
			} else if (line[0].trim().equalsIgnoreCase("zielkrankenhaus")) {
				if (line.length > 1) {
					zielkrankenhaus = readPlainTextValue(line);
				}
				
			// KRANKENKASSE
			} else if (line[0].trim().equalsIgnoreCase("krankenkasse")) {
				if (line.length > 1) {
					krankenkasse = readPlainTextValue(line);
				}
			}
		}
		
		TriageTag tag = new TriageTag(document_uid, document_vnr, document_parent_uid, document_parent_vnr, effectiveTime,
				given, family, gender, birthdate, author_uid, author_given, author_family, gehfaehigkeit, respiration, perfusion,
				mentalerstatus, behandlungsstatus, triagekategorie, gps_longitude, gps_latitude, 
				gps_accuracy, lebensphase, hilfplatzposition, bergeinformation, urgency, diagnosis,
				blood_pressure_systolic, blood_pressure_diastolic, puls, behandlungsverlauf,
				transportbereitschaft, zielkrankenhaus, krankenkasse);
		
		/**
		 * VERLETZUNGEN
		 */		
		String[] verletzungenArray = verletzungenstring
				.split(Pattern.quote("<br />") + "|" + Pattern.quote("<br/>"));
		
		for (String s : verletzungenArray) {
			String[] line = s.split(":");
			
			TriageTag.BodyPart currentBodyPart = TriageTag.BodyPart.getFromString(line[0].trim());
			
			if (currentBodyPart != null) {				
				if (line.length > 1) {
					String verletzung = readPlainTextValue(line).trim();
					
					if (!verletzung.equals("")) {
						tag.setVerletzung(currentBodyPart, verletzung);
					}
				}
			}
		}
		
		return tag;
	}
	
	/**
	 * Falls in einer Zeile eines Plaintext-Attributes zusätzliche ":" vorkommen,
	 * soll die ganze Zeile eingelesen werden, nicht nur line[1]. Dies ist deshalb
	 * wichtig, weil das Key-Value-Paar (key: value) an ":" gesplittet wird und
	 * falls value weitere ":" enthält, nicht vollständig ausgelesen wird.
	 * @param line	eingelesenes Key-Value-Paar
	 * @return	zusammengesetzte Value
	 */
	private static String buildPlainTextAttribute(String[] line) {
		String result = "";
		for (int i = 1; i < line.length; i++) {
			result += line[i];
		}
		return result;
	}
	
	/**
	 * Diese Methode überprüft für sämtliche Plaintext-Attribute, ob mehrere ":"
	 * vorhanden sind und retourniert den entsprechenden value.
	 * @param line	Key-Value-Line (z.B: gehfaehigkeit: ja)
	 * @return		value des Key-Value-Paars (im oberen Bsp also "ja")
	 */
	private static String readPlainTextValue(String[] line) {
		String concatString = "";
		// es sind Doppelpunkte vorhanden im Plain-Text
		if (line.length > 2) {
			concatString = buildPlainTextAttribute(line);
		} else {
			// es sind keine Doppelpunkte vorhanden
			concatString = line[1].trim();
		}
		return concatString;
	}	

	/**
	 * @see CDAParser#XmlToTriageTagObject(Document), nur das Document davor aus Pfad geladen wird.
	 * @param path Pfad des CDA-Dokument, das geparsed werden soll.
	 * @return
	 * @throws NumberFormatException 
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 * @throws XPathExpressionException
	 */
	public static TriageTag XmlToTriageTagObject(String path) throws NumberFormatException, ParserConfigurationException, SAXException, IOException {
		 return XmlToTriageTagObject(createXmlDocument(path));
	}
	
	
	//For REST-Client (Android)
	public static Document TriageTagObjectToXml(TriageTag tag, InputSource template) throws ParserConfigurationException, SAXException, IOException {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();	
		factory.setNamespaceAware(true);
		DocumentBuilder builder = factory.newDocumentBuilder();
		
		// XML-File einlesen
		Document doc =  builder.parse(template);
		return TriageTagObjectToXml(tag, doc);
	}
	
	//For REST-Server
	public static Document TriageTagObjectToXml(TriageTag tag) throws ParserConfigurationException, SAXException, IOException {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();	
		factory.setNamespaceAware(true);
		DocumentBuilder builder = factory.newDocumentBuilder();
		
		// XML-File einlesen
		Document doc =  builder.parse("cda_template.xml");
		return TriageTagObjectToXml(tag, doc);
	}
	
	/**
	 * Diese Methode erstellt aus einem TriageTag-Objekt ein valides HL7-CDA-Dokument (Level 1)
	 * nach unseren Vorgaben.
	 * @param tag	TriageTag-Objekt, aus dem das CDA-Dokument generiert wird.
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 * @throws XPathExpressionException
	 * @throws TransformerException
	 */
	private static Document TriageTagObjectToXml(TriageTag tag, Document doc) throws ParserConfigurationException, SAXException, IOException {		
		

		
		/**
		 * HEADER-Daten setzen
		 */
		
		// document_uid setzen
		doc.getElementsByTagName("id").item(0).getAttributes().item(0).setNodeValue(tag.getDocument_uid());
		
		// document_vnr setzen
		doc.getElementsByTagName("versionNumber").item(0).
				getAttributes().item(0).setNodeValue(String.valueOf(tag.getDocument_vnr()));
		
		// document_parent_uid setzen
		doc.getElementsByTagName("id").item(4).
				getAttributes().item(0).setNodeValue(tag.getDocument_parent_uid());
				
		// document_parent_vnr setzen
		doc.getElementsByTagName("versionNumber").item(1).
				getAttributes().item(0).setNodeValue(String.valueOf(tag.getDocument_parent_vnr()));		
				
		// effectiveTime setzen		
		String year = String.valueOf(tag.getEffectiveTime().get(Calendar.YEAR));
		String month = String.valueOf(tag.getEffectiveTime().get(Calendar.MONTH) + 1);
		String day = String.valueOf(tag.getEffectiveTime().get(Calendar.DAY_OF_MONTH));
		if (month.length() == 1) {
			month = "0" + month;
		}
		if (day.length() == 1) {
			day = "0" + day;
		}		
		doc.getElementsByTagName("effectiveTime").item(0).getAttributes()
			.item(0).setNodeValue(year + month + day);
		
		// given setzen		
		doc.getElementsByTagName("given").item(0).setTextContent(tag.getGiven());
				
		// family setzen
		doc.getElementsByTagName("family").item(0).setTextContent(tag.getFamily());
				
		// gender setzen
		doc.getElementsByTagName("administrativeGenderCode").item(0).
			getAttributes().item(0).setNodeValue(tag.getGender().toString());
				
		// birthdate setzen
		year = String.valueOf(tag.getBirthdate().get(Calendar.YEAR));
		month = String.valueOf(tag.getBirthdate().get(Calendar.MONTH) + 1);
		day = String.valueOf(tag.getBirthdate().get(Calendar.DAY_OF_MONTH));
		if (month.length() == 1) {
			month = "0" + month;
		}
		if (day.length() == 1) {
			day = "0" + day;
		}
		doc.getElementsByTagName("birthTime").item(0).getAttributes()
			.item(0).setNodeValue(year + month + day);
		
		// author_uid setzen
		doc.getElementsByTagName("id").item(2).getAttributes().item(0).setNodeValue(tag.getAuthor_uid());
		
		// author_given setzen
		doc.getElementsByTagName("given").item(1).setNodeValue(tag.getAuthor_given());
		
		// author_family setzen
		doc.getElementsByTagName("family").item(1).setNodeValue(tag.getAuthor_family());
		
		/**
		 * BODY-Daten setzen
		 */
		
		// Vitalzeichen setzen
		NodeList texttags = doc.getElementsByTagName("text");
		
		String gehfaehigkeitString = "";
		
		if (tag.getGehfaehigkeit() != null) {
			if (tag.getGehfaehigkeit()) gehfaehigkeitString = "Ja";
			else gehfaehigkeitString = "Nein";
		}
		
		/**
		 * TODO: evtl. null-Ueberpruefungen einbringen (obwohl Pflichtfelder)
		 */
		
		texttags.item(0).setTextContent("\ngehfaehigkeit: " + gehfaehigkeitString + " <br />\n" +
				"respiration: " + tag.getRespiration().toString() + " <br />\n" + 
				"perfusion: " + tag.getPerfusion().toString() + " <br />\n" + 
				"mentalerstatus: " + tag.getMentalerstatus() + " <br />\n" +
				"triagekategorie: " + tag.getTriagekategorie().toString() + " <br />\n" +
				"behandlung: " + tag.getBehandlungsstatus().toString() + " <br />\n");
		
		// Details setzen		
		/**
		 * Da die folgenden Attribute nur optional sind, muss eine ï¿½berprï¿½fung auf null erfolgen.
		 * Das ist deswegen wichtig, weil im XML-File nicht "null" stehen sollte, sondern einfach
		 * ein leerer String.
		 */
		String gpsString = "";
		if (tag.getGps_latitude() != null && tag.getGps_longitude() != null &&
				tag.getGps_accuracy() != null) {
			gpsString = tag.getGps_latitude() + ", " + tag.getGps_longitude() + ", " + tag.getGps_accuracy();
		}
		
		String lebensphaseString = "";
		if (tag.getLebensphase() != null) lebensphaseString = tag.getLebensphase().toString();
		
		String bergeinformationString = "";
		if (tag.getBergeinformation() != null) bergeinformationString = tag.getBergeinformation();
		
		String hilfplatzpositionString = "";
		if (tag.getHilfplatzposition() != null) hilfplatzpositionString = tag.getHilfplatzposition();
		
		String dringlichkeitString = "";
		if (tag.getUrgency() != null) dringlichkeitString = String.valueOf(tag.getUrgency());
		
		String diagnoseString = "";
		if (tag.getDiagnosis() != null) diagnoseString = tag.getDiagnosis();
		
		String blutdruckString = "";
		if (tag.getBlood_pressure_systolic() != null && tag.getBlood_pressure_diastolic() != null) {
			blutdruckString = tag.getBlood_pressure_systolic() + ":" + tag.getBlood_pressure_diastolic();
		}
		
		String pulsString = "";
		if (tag.getPuls() != null) pulsString = String.valueOf(tag.getPuls());
		
		String behandlungsverlaufString = "";
		if (tag.getBehandlungsverlauf() != null) behandlungsverlaufString = tag.getBehandlungsverlauf();
		
		String transportbereitschaftString = "";
		if (tag.getTransportbereitschaft() != null) {
			if (tag.getTransportbereitschaft()) transportbereitschaftString = "Ja";
			else transportbereitschaftString = "Nein";
		}
		
		String zielkrankenhausString = "";
		if (tag.getZielkrankenhaus() != null) zielkrankenhausString = tag.getZielkrankenhaus();
		
		String krankenkasseString = "";
		if (tag.getKrankenkasse() != null) krankenkasseString = tag.getKrankenkasse();
		
		texttags.item(1).setTextContent("\ngps: " + gpsString + " <br />\n" +
				"lebensphase: " + lebensphaseString + " <br />\n" +
				"bergeinformation: " + bergeinformationString + " <br />\n" + 
				"hilfplatzposition: " + hilfplatzpositionString + " <br />\n" +
				"dringlichkeit: " + dringlichkeitString + " <br />\n" + 
				"diagnose: " + diagnoseString + " <br />\n" +
				"blutdruck: " + blutdruckString + " <br />\n" +
				"puls: " + pulsString + " <br />\n" +
				"behandlungsverlauf: " + behandlungsverlaufString + " <br />\n" +
				"transportbereitschaft: " + transportbereitschaftString + " <br />\n" + 
				"zielkrankenhaus: " + zielkrankenhausString + " <br />\n" + 
				"krankenkasse: " + krankenkasseString + " <br />\n");
		
		// Verletzungen setzen
		if (tag.getVerletzungen() != null) {
			String[] bodyparts = TriageTag.BodyPart.toStringArray();		
			String verletzungenString = "\n";
			
			for (String s : bodyparts) {
				verletzungenString += 
						s + ": " + findMatchingVerletzungByBodyPart(tag.getVerletzungen(), s) + " <br />\n";
			}
			
			texttags.item(2).setTextContent(verletzungenString);
		}
		
		return doc;
	}
	
	/**
	 * Erstellt ein XML-Dokument anhand einer XML-Datei, die mittels Path lokalisiert wird.
	 * @param path	Pfad der XML-Datei
	 * @return		XML-Dokument mit Inhalt der XML-Datei
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 */
	private static Document createXmlDocument(String path) throws ParserConfigurationException, SAXException, IOException {
		DocumentBuilderFactory factory = 
				DocumentBuilderFactory.newInstance();	
		factory.setNamespaceAware(true);
		DocumentBuilder builder = factory.newDocumentBuilder();
		return builder.parse(path);
	}
	
	 /**
	  * Diese Funktion durchsucht die Verletzungen-HashMap nach dem Vorkommen eines bestimmten
	  * BodyParts. Wird der BodyPart gefunden, so wird die zugehï¿½rige Verletzung retourniert.
	  * Falls nicht, wird ein leerer String retourniert. Diese Methode wird fï¿½r das Erstellen
	  * des CDA-Dokuments aus einem TriageTag-Objekt verwendet.
	  * @param verletzungen HashMap mit Bodyparty/Verletzungen
	  * @param bodypart String-Name eines BodyParts, dessen Verletzung gesucht wird
	  * @return Verletzung des gesuchten BodyParts oder leerer String
	  */
	private static String findMatchingVerletzungByBodyPart (HashMap<TriageTag.BodyPart, String> verletzungen, String bodypart) {
		Set<Entry<TriageTag.BodyPart, String>> set = verletzungen.entrySet();
		Iterator<Entry<TriageTag.BodyPart, String>> iterator = set.iterator();
		
		while(iterator.hasNext()) {
			Entry<TriageTag.BodyPart, String> element = iterator.next();
			if (element.getKey().toString().equals(bodypart)) {
				return element.getValue();
			}
		}
		return "";
	}
}